<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>绘制形状-path</title>
  <style>
    .wrap {
      width: 1000px;
      /*height: 800px;*/
      border: 1px solid #000;
      margin: 20px auto;
      padding: 10px;
    }
    .note{
      background: #fff3d4;
      border-color: #f6b73c;
      padding-left: 30px;
      box-sizing: border-box;
      max-width: 42rem;
      overflow: hidden;
      margin-bottom: 20px;
      /*padding: 10px;*/
      clear: none;
      font-size: 1.125rem;
      border-left-width: 5px;
      border-left-style: solid;
    }
  </style>
</head>
<body>

<div class="wrap">
  <h4>
    绘制path --- 使用所有的路径函数来重现一组著名的游戏人物
  </h4>
  <ul>
    <li>

    </li>
  </ul>

  <div class="note">
    <strong>

    </strong>
  </div>

  <canvas id="canvas" width="150" height="150"></canvas>

</div>

</body>
</html>
<script>
  function draw() {
    let canvas = document.getElementById('canvas');
    if(canvas.getContext){
      let ctx = canvas.getContext('2d');

      // 生成圆角矩形
      roundedRect(ctx,12,12,150,150,15);
      roundedRect(ctx,19,19,150,150,9);
      roundedRect(ctx,53,53,49,33,10);
      roundedRect(ctx,53,119,49,16,6);
      roundedRect(ctx,135,53,49,33,10);
      roundedRect(ctx,135,119,25,49,10);

      // 吃豆人
      ctx.beginPath();
      ctx.arc(37,37,13,Math.PI/7,-Math.PI/7,false);
      ctx.lineTo(31,37);
      ctx.fill();

      // 吃豆人水平一排的点
      for(let i=0;i<8;i++){
        ctx.fillRect(51+i*16,35,4,4);
      }

      // 吃豆人前方第一个十字路口的点
      for(let i=0;i<6;i++){
        ctx.fillRect(115,51+i*16,4,4);
      }

      // 吃豆人隔壁街的原点
      for(let i=0;i<8;i++){
        ctx.fillRect(51+i*16,99,4,4);
      }

      // 怪物-肉体
      ctx.beginPath();
      ctx.moveTo(83,116);
      ctx.lineTo(83,102);
      ctx.bezierCurveTo(83,94,89,88,97,88);
      ctx.bezierCurveTo(105,88,111,94,111,102);
      ctx.lineTo(111,116);
      ctx.lineTo(106.333,111.333);
      ctx.lineTo(101.666,116);
      ctx.lineTo(97,111.333);
      ctx.lineTo(92.333,116);
      ctx.lineTo(87.666,111.333);
      ctx.lineTo(83,116);
      ctx.fill();

      // 笔触颜色
      ctx.fillStyle = '#fff';
      ctx.beginPath();
      // 左眼眶
      ctx.moveTo(91,96);
      ctx.bezierCurveTo(88,96,87,99,87,101);
      ctx.bezierCurveTo(87,103,88,106,91,106);
      ctx.bezierCurveTo(94,106,95,103,95,101);
      ctx.bezierCurveTo(95,99,94,96,91,96);
      // 右眼眶
      ctx.moveTo(103,96);
      ctx.bezierCurveTo(100,96,99,99,99,101);
      ctx.bezierCurveTo(99,103,100,106,103,106);
      ctx.bezierCurveTo(106,106,107,103,107,101);
      ctx.bezierCurveTo(107,99,106,96,103,96);
      ctx.fill();

      // 黑眼球
      ctx.fillStyle = "black";
      ctx.beginPath();
      ctx.arc(101,102,2,0,Math.PI*2,true);
      ctx.fill();

      ctx.beginPath();
      ctx.arc(89,102,2,0,Math.PI*2,true);
      ctx.fill();
    }
  }

  draw();


  /**
   * 圆角矩形
   * @param ctx 笔触
   * @param x 原点
   * @param y
   * @param width 宽
   * @param height 高
   * @param radius 圆角
   */
  function roundedRect(ctx,x,y,width,height,radius) {
    ctx.beginPath();
    ctx.moveTo(x,y+radius);
    ctx.lineTo(x,y+height-radius);
    ctx.quadraticCurveTo(x,y+height,x+radius,y+height);
    ctx.lineTo(x+width-radius,y+height);
    ctx.quadraticCurveTo(x+width,y+height,x+width,y+height-radius);
    ctx.lineTo(x+width,y+radius);
    ctx.quadraticCurveTo(x+width,y,x+width-radius,y);
    ctx.lineTo(x+radius,y);
    ctx.quadraticCurveTo(x,y,x,y+radius);
    ctx.stroke();
  }

</script>